let name = "张三";
let age = 23;
let say = "我的名字叫"+name+",今年"+age+"岁";
console.log( say );
// ES6的JS的扩展定义方式：模板语法 【字符的拼接简化语法】
//      模板语法中通过表示符 ${变量名} 可以省略 + 字符拼接
//      模板字符串可以换行定义
let say1 = `我的名字叫${name},今年${age}岁`;
console.log(say1);
let say2 = `我的名字叫${name},
今年${age}岁`;
// 等同于 如下
// let say2 = `我的名字叫${name},\n年${age}岁`;
console.log(say2);

// length 属性 ： 获取字符串长度
console.log( say,"长度",say.length );
console.log( say1,"长度",say1.length );
console.log( say2,"长度",say2.length );

let str1 = "是abcdefghijk";
// 字符获取方法
//      + 字符串的字符下标 - 从 0 开始 以地址偏移量进行字符描述
//      + js的数据内置方法，可以通过 属性方法访问符 . 进行调用
// charAt(index) - 基于下标获取字符串中对应的字符
console.log( str1.charAt(3) )
// charCodeAt(index) - 基于下标获取字符串中对应的字符,并转换为 code 编码
console.log( str1.charCodeAt(1) )
// codePointAt(index) - 基于下标获取字符串中对应的字符,并转换为 code 编码
console.log( str1.charCodeAt(0) )
console.log( str1.codePointAt(0) )

// concat(...str) 字符连接方法
let str2 = "字符串-".concat("a-","b-","c-")
console.log( str2 )

// startsWith( findStr , starIndex ) 判断指定字符串从starIndex开始是否以findStr开头
// endsWith( findStr , length)  判断指定字符串在指定length长度内是否以findStr结尾
//   JS 中会存在大量的方法具有多参数性质，但也不是所有参数都需要在使用方法时进行传递
//      - JS是弱类型的脚本语言，所以函数(方法)是不存在重载规则
//      - JS是通过传递的参数数量或者参数类型，为同一个方法提供不同的执行功能，模拟重载
let tel = "+86181300000000";
console.log( tel.startsWith("+86") )
console.log( tel.startsWith("18",3) )
let idcart = "3424011990120120045X";
console.log( idcart.endsWith("X") )
console.log( idcart.endsWith("X",6) )

// includes(str,index)	返回字符串是否包含指定值。
console.log( "aabbccdd".includes("ab") )
console.log( "aabbccdd".includes("ab",4) )

// indexOf()	返回值在字符串中第一次出现的位置。
// lastIndexOf()	返回值在字符串中最后一次出现的位置。
console.log( "abcdef".indexOf("c") )
console.log( "abcdef".indexOf("cd") )
console.log( "abcdef".indexOf("cf") ) // -1 表示没有匹配结果

// search()	检索字符串中与字符字串或者正则表达式匹配的子串。如果匹配返回下标
console.log( "abcabcabc".search("ca") )
console.log( "abcabcabc".search("ee") )

// localeCompare(target)	使用基于本地的顺序来比较字符串。
console.log( "ab".localeCompare("de") )
console.log( "ab".localeCompare("aa") )

// repeat(count)	返回拥有多个字符串副本的新字符串。
let newStr = "abc".repeat(3)
console.log(newStr)

// replace(repstr,newstr)	在字符串中搜索值或正则表达式，并返回替换值的字符串。
// replaceAll(repstr,newstr)  在字符串中搜索值或正则表达式，并返回替换值的字符串。
//     replace 和  replaceAll 不使用全局匹配正则时，replace只能替换第一次出现字符串
//                                              replaceAll可以匹配所有字符串
console.log( "abcabcabc".replace("c","-") )
console.log( "abcabcabc".replaceAll("c","-") )

// slice( sindex,eindex )	提取字符串的一部分并返回新字符串。
//          [sindex,eindex)
let str3 = "abcdefghijk"; // length=11
let str31 = str3.slice(3,5);
console.log(str31);
let str32 = str3.slice(6,20); // [6,20)
console.log(str32);
let str33 = str3.slice(0,-8); // 从下标 0 截取到 倒数第 8个字符串
console.log(str33);
let str34 = str3.slice(9,-4); // “”  9 和 倒数 4 之间没有闭合空间
console.log(str34);
let str35 = str3.slice(-6,-3);
console.log(str35)

// split(separator,limit)	将字符串拆分为子字符串数组。
console.log( "ab-cd-ef-gh".split("-") )
console.log( "ab-cd-ef-gh".split("-",2) ) // 只获取分解后的前两个结果
console.log( "abcdefgh".split("") ) // 按照空格进行分割 - 拆分字符

// trim()	返回删除了空格的字符串。
// trimEnd()	返回从末尾删除空格的字符串。
// trimStart()	返回从开头删除空格的字符串。
console.log( "|"+"    abc   "+"|" )
console.log( "|"+"    abc   ".trim()+"|" )
console.log( "|"+"    abc   ".trimStart()+"|" )
console.log( "|"+"    abc   ".trimEnd()+"|" )

// substring(start,end)	从字符串中抽取子串。
//          start>=0  end>=0   [start,end)
//              start 取值为负值时，会直接忽略使用默认值 0
//              end 取值负值时，会返回 “”
console.log( "abcdefg".substring(0,3) )
// console.log( "abcdefg".substring(-3,-2) )

// substr(start,length)	从字符串中抽取子串，该方法是 substring() 的变种。
//          start 均可以取负值，负值表示倒数
//          length 表示截取多长
//      以在新 ES 规范中被废弃
console.log( "abcdefg".substr(0,3) ) // 从 下标 0 开始截取 3 位
console.log( "abcdefg".substr(-5,3) ) // 从倒数第5位截取3个字符

// toLocaleLowerCase()	使用主机的语言环境返回转换为小写字母的字符串。
// toLocaleUpperCase()	使用主机的语言环境返回转换为大写字母的字符串。
// toLowerCase()	返回转换为小写字母的字符串。
// toUpperCase()	返回转换为大写字母的字符串。







